<?php

include_once __DIR__ . "/libs/cls_error.php";

/**
 * 模板引擎类
 **/
class magic {
    //基础配置
	private $config = array(
		// 文件目录
		'dir_path' => 'template/',
        // 模板文件目录
        'dir_template' => 'theme/default/',
        // 编译文件目录
        'dir_compile' => 'compile/',
        // 缓存文件目录
        'dir_cache' => 'cache/',
        // 模板文件后缀
        'suffix_tpl' => '.tpl',		
        // 缓存文件后缀
        'suffix_cache' => '.tpl',	
        // 是否开启缓存
		'cache'	=>false,
		// 是否打印错误信息
		'debug' => false,
    );
    // 模板文件
    private $file_template;		
    // 编译文件
    private $file_compile;	
    // 缓存文件
    private $file_cache;		
    // 变量值栈
    private $value = array();
    // 初始化
	public function __construct($config = null) {
		// 同步配置
		if(is_array($config)) {
			$this->config = array_merge($this->config, $config);
		}
		// 目录地址转换为绝对地址
		$this->config["dir_template"] = $this->getDir($this->config["dir_template"]);
		$this->config["dir_compile"]  = $this->getDir($this->config["dir_compile"]);
		$this->config["dir_cache"]    = $this->getDir($this->config["dir_cache"]);
		// 检查模板编译缓存目录是否存在不存在创建
		if( !$this->checkDir( $this->config['dir_template']) || !$this->checkDir($this->config['dir_compile']) || !$this->checkDir($this->config['dir_cache']) ) {
			exit;
		}
	}

 
	/**
	 * 像模板中分配变量
	 **/
	public function assign($k, $v) {
		if(!empty($k) && !empty($v)) {
			$this->value[$k] = $v;
		}else {
			err::setError('分配变量失败：','分配到模板中变量的key或者value为空！');
		}
	}
 
	/**
	 * 编译文件
	 **/
	public function display($file, $id = "default") {
		// 获取模板文件
		$tmpFile = $this->config['dir_template'] . $file . $this->config['suffix_tpl'];
		// 获取编译文件
		$cmpFile = $this->config['dir_compile'] . md5($tmpFile . 'compile') . '-' . $id . '-' . $file . '.php';
		if(!file_exists($tmpFile)) {
			err::setError('模板文件不存在:', $tmpFile.'不存在');
		}
		else {
			// 当编译文件不存在或者是模板文件被修改过了才重新编译
			if(!file_exists($cmpFile) || filemtime($cmpFile) < filemtime($tmpFile)) {
				include_once __DIR__ . "/libs/cls_compile.php";
				$cmp = new compile();
				$cmp-> execute($tmpFile, $cmpFile, $this->config['dir_template'], $this->config['suffix_tpl']);
			}
			
			// 是否开启缓存
			if($this->config['cache']) {
				// 获取缓存文件
				$cacheFile = $this->config['dir_cache'] . md5($tmpFile . 'cache') . '-' . $id . '-' . $file . $this->config['suffix_cache'];
				// 当缓存文件不存在或者是模板文件被修改过重新生成缓存文件
				if(!file_exists($cacheFile) || filemtime($cacheFile) < filemtime($tmpFile)) {
					ob_start();
					include_once $cmpFile;
					$content = ob_get_clean();
					if(!file_put_contents($cacheFile, $content)){
						err::setError('编译文件生成失败：', $cacheFile);
					}
				}
				// 载入缓存文件
				include $cacheFile;
			}else {
				// 载入编译文件
				include_once $cmpFile;
			}
		}

		// 是否打印错误信息
		if($this->config['debug']) {
			err::getError();
		}
	}

	 
	/**
	 * 检查目录是否存在不存在自动创建
	 **/
	private function checkDir($dir) {
		if(!is_dir($dir)) {
			if(!mkdir($dir)) {
				err::setError('创建文件夹失败：', $dir);
				return false;
			}
		}
		return true;
	}

	
	/**
	 * 获取目录绝对地址
	**/
	public function getDir($dir) {
		return __DIR__ . '/' . $this->config["dir_path"] . $dir;
	}


	/**
	 * 获取配置变量 
	**/
	public function getConfig($name) {
		return $this->config[$name];
	}
}